package demo.Thread;

/**
 * @Auther: hjy(lc))
 * @Date: 2022/8/10-08-10-14:12
 * @Description：demo.Thread   解决线程安全问题
 */
/*
方法一：
    每个线程操作自己的变量（局部变量），不允许操作公有变量
方法二：
    使用同步代码块： synchronized(锁对象){可能引发线程安全的代码}
方法三：
    使用同步方法： 修饰符 synchronized 返回值类型 方法名（参数列表）{}
    e.g. Num_print()

 */
public class solve_thread_security {
    static int num = 10;
    public static void main(String[] args) {
        solve_thread_security s = new solve_thread_security();
        myList list = new myList();
        Thread thread1 = new Thread(){
            @Override
            public void run() {
//                synchronized (s){
//                    while(num > 0){
//                        System.out.println("thread1: " + num);
//                        num--;
//                    }
//                }
                Num_print();
                for (int i = 0; i < 10; i++) {
                    list.add(i);
                }
            }
        };
        Thread thread2 = new Thread(){
            @Override
            public void run() {
//                synchronized (s){
//                    while(num > 0){
//                        System.out.println("thread2: " + num);
//                        num--;
//                    }
//                }
                Num_print();
                for (int i = 10; i < 20; i++) {
                    list.add(i);
                }
            }
        };
        thread1.start();
        thread2.start();
    }
    public static synchronized void Num_print(){
        while(num > 0){
            System.out.println("thread2: " + num);
            num--;
        }
    }
}
class myList{
    int[] arr = new int[20];
    int index = 0;
    public synchronized void add(int num){
        arr[index] = num;
        System.out.println(index + ": " + num);
        index++;
    }
}
